/**
 * WebSocket请求类
 * @param {string} url WebSocket服务器的URL
 * @returns {WebSocketRequest}
 */
import emitter from "@/utils/mitt.js";
class WebSocketRequest {
  constructor(url) {
    this.url = url;
    this.ws = null;
    this.onOpen = null;
    this.onMessage = null;
    this.onError = null;
    this.onClose = null;
  }

  /**
   * 连接到WebSocket服务器。
   *
   */
  connect() {
    // 创建一个新的WebSocket实例，连接到指定的URL。
    this.ws = new WebSocket(this.url);

    // 定义连接打开时的处理程序。
    this.ws.onopen = (event) => {
      console.log("WebSocket 已连接:", event);
      if (this.onOpen) this.onOpen(event);
    };

    // 定义接收消息时的处理程序。
    this.ws.onmessage = (event) => {
      console.log("收到消息:", event.data);
      const messageData = JSON.parse(event.data); //消息类型
      this.subscribeMessage(messageData);
    };

    // 定义连接发生错误时的处理程序。
    this.ws.onerror = (event) => {
      console.error("WebSocket 错误:", event);
      if (this.onError) this.onError(event);
    };

    // 定义连接关闭时的处理程序。
    this.ws.onclose = (event) => {
      console.log("WebSocket 已关闭:", event);
      if (this.onClose) this.onClose(event);
    };
  }

  /**
   * 发送消息到WebSocket服务器。
   *
   * 此函数旨在通过WebSocket连接发送一条消息。如果WebSocket连接状态正确（即连接已打开），
   * 则消息将被发送。如果连接状态不正确，则会在控制台输出错误信息。
   *
   * @param {string} message 要发送的消息内容。
   */
  sendMessage(message) {
    // 检查WebSocket连接状态是否为OPEN，即是否可以发送消息
    if (this.ws.readyState === WebSocket.OPEN) {
      // 发送消息
      this.ws.send(message);
    } else {
      // 在WebSocket连接状态不正确时，输出错误信息到控制台
      console.error("WebSocket 状态不正确，无法发送消息");
    }
  }

  /**
   * 关闭WebSocket连接。
   *
   * 此函数用于关闭当前实例的WebSocket连接。如果WebSocket实例存在，则调用其close方法进行关闭。
   * 这是确保WebSocket连接在不需要时被正确清理的重要步骤，有助于资源管理。
   *
   * 参数: 无
   * 返回值: 无
   */
  close() {
    // 检查WebSocket实例是否存在，如果存在则关闭它
    if (this.ws) {
      this.ws.close();
    }
  }

  /**
   * 订阅上报信息
   *
   */
  subscribeMessage(messageData) {
    console.log("订阅的发布信息", messageData);
    if (messageData.type === "warning") {
      emitter.emit("message-type", messageData);
    }
  }
}

export default WebSocketRequest;
